package cn.iocoder.yudao.module.mqtt.service;

import cn.iocoder.yudao.module.mqtt.framework.mqtt.MqttInstanceManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 多MQTT实例消息发送器
 * 支持根据选择的MQTT实例发送消息
 *
 * @author 芋道源码
 */
@Slf4j
@Component
public class MultiMqttMessageSender {

    @Autowired
    private MqttInstanceManager mqttInstanceManager;

    /**
     * 发送消息到指定的MQTT实例
     *
     * @param configId MQTT配置ID
     * @param topic 主题
     * @param msg 消息内容
     */
    public void sendMsg(Long configId, String topic, String msg) {
        try {
            if (!mqttInstanceManager.isInstanceRunning(configId)) {
                log.error("MQTT实例未运行，配置ID: {}", configId);
                return;
            }
            
            mqttInstanceManager.sendMessage(configId, topic, msg);
            log.info("消息发送成功 - 配置ID: {}, 主题: {}, 内容: {}", configId, topic, msg);
        } catch (Exception e) {
            log.error("消息发送失败 - 配置ID: {}, 主题: {}, 内容: {}", configId, topic, msg, e);
        }
    }

    /**
     * 发送消息到指定的MQTT实例（指定QoS）
     *
     * @param configId MQTT配置ID
     * @param topic 主题
     * @param qos 服务质量
     * @param msg 消息内容
     */
    public void sendMsg(Long configId, String topic, int qos, String msg) {
        try {
            if (!mqttInstanceManager.isInstanceRunning(configId)) {
                log.error("MQTT实例未运行，配置ID: {}", configId);
                return;
            }
            
            // 注意：这里简化处理，实际应该支持QoS设置
            mqttInstanceManager.sendMessage(configId, topic, msg);
            log.info("消息发送成功 - 配置ID: {}, 主题: {}, QoS: {}, 内容: {}", configId, topic, qos, msg);
        } catch (Exception e) {
            log.error("消息发送失败 - 配置ID: {}, 主题: {}, QoS: {}, 内容: {}", configId, topic, qos, msg, e);
        }
    }

    /**
     * 广播消息到所有运行的MQTT实例
     *
     * @param topic 主题
     * @param msg 消息内容
     */
    public void broadcastMsg(String topic, String msg) {
        java.util.Set<Long> runningInstanceIds = mqttInstanceManager.getRunningInstanceIds();
        for (Long configId : runningInstanceIds) {
            sendMsg(configId, topic, msg);
        }
        log.info("广播消息完成 - 主题: {}, 内容: {}, 实例数量: {}", topic, msg, runningInstanceIds.size());
    }

    /**
     * 检查MQTT实例是否运行
     *
     * @param configId MQTT配置ID
     * @return 是否运行
     */
    public boolean isInstanceRunning(Long configId) {
        return mqttInstanceManager.isInstanceRunning(configId);
    }

    /**
     * 获取所有运行的实例ID
     *
     * @return 运行的实例ID集合
     */
    public java.util.Set<Long> getRunningInstanceIds() {
        return mqttInstanceManager.getRunningInstanceIds();
    }
} 